// leetcode 30. 串联所有单词的子串
//class Solution {
//    public List<Integer> findSubstring(String s, String[] words) {
//        List<Integer> ret = new ArrayList<>();
//        // 把一个单词看似为一个字母   foo -> a
//        // 统计每个单词出现的次数
//        Map<String, Integer> hash = new HashMap<>();
//        for (String word : words) {
//            int val = hash.getOrDefault(word, 0);
//            hash.put(word, val + 1);
//        }
//        int n = words[0].length();
//        for (int i = 0; i < n; i++) {
//            Map<String, Integer> map = new HashMap<>();
//            for (int left = i, right = i, count = 0; right < s.length(); right += n) {
//                if (right + n > s.length()) break;
//                String word = s.substring(right, right + n);
//                int val = map.getOrDefault(word, 0);
//                map.put(word, val + 1);
//                if (val + 1 <= hash.getOrDefault(word, 0)) count++;
//                while (left < right && right + n - left > n * words.length) {
//                    String word2 = s.substring(left, left + n);
//                    int val2 = map.getOrDefault(word2, 0);
//                    if (val2 <= hash.getOrDefault(word2, 0)) count--;
//                    map.put(word2, val2 - 1);
//                    left += n;
//                }
//                if (count == words.length) ret.add(left);
//            }
//        }
//
//        return ret;
//    }
//}